home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmiSoft / Util / Misc / Chkindex.lha / ChkIndex / ChkIndex.s < prev    next >
Text File  |  2003-01-22  |  44KB  |  1,564 lines

  1. *****************************************************************************
  2. *                                        *
  3. *    PROGRAM: ChkIndex                            *
  4. *    VERSION: 1.9                                *
  5. *   SOURCE CODE: 32                                *
  6. *       DATE: 22.12.2002 - 22.01.2003                    *
  7. *      LANGUAGE: Assembler (DevPac V3.14)                    *
  8. *     SYSTEM: A1200    KS 40.68 WB 40.42 2MB chip 64MB fast 68030/50mhz    *
  9. *                                        *
  10. *     AUTHOR: Joerg Riemer 14167 Berlin/SchottmuellerStr.107/Germany        *
  11. *      EMAIL: joerg_riemer@freenet.de / mission@cs.tu-berlin.de         *
  12. *                                        *
  13. *    COMMENT: search the aminet index_file for identical entries        *
  14. *                                        *
  15. *      TEMPLATE: INDEX/A,OUTPUT/A,WS=WRITESORTED/K,SKIP/N            *
  16. *                                        *
  17. *         INDEX/A       path/name of indexfile                *
  18. *         OUTPUT/A      just the outputfile for identical lines        *
  19. *         WRITESORTED/K save indexfile sorted by filename        *
  20. *         SKIP/N        skip # of lines (index header = 8 lines)        *
  21. *                                        *
  22. *     OPTION: To make ChkIndex as short as possible, set BSS_Section     *
  23. *         to NULL and use StripHunk to generate a Code_BSS-segment.  *
  24. *         spares some bytes! but for anybody don't know what this    *
  25. *         means:    "leave it as it is"                    *
  26. *                                         *
  27. *         StripHunk is available at AmiNet dev/misc/...            *
  28. *                                        *
  29. *         for suggestions, hints/tips, and/or questions,            *
  30. *         send an email! (see above for address)                *
  31. *                                        *
  32. *****************************************************************************
  33.  
  34. *        opt    d+
  35. *        opt    o+
  36.  
  37. BSS_Section    set    1
  38.  
  39. *****************************************************************************
  40.  
  41.     output    ram:ChkIndex
  42.  
  43. *****************************************************************************
  44. *
  45. * small statistic (checked while debugging)
  46. *
  47. * aminet indexfile size: 5.277.715 lines: 71.861 date: 16.3.2003
  48. *
  49. * GetIFile    =  2.017744 sec. (open file; allocmem; read file)
  50. * CreateEList    =  2.613314 sec. (allocmem; create list for all lines)
  51. * SortEList    =  6.436765 sec. (sort list [quicksort])
  52. * GetMEntries   =  3.829775 sec. (search for multiple entries; write lines)
  53. * -----------------------------
  54. *                 14.897598 sec.
  55. * -----------------------------
  56. * WriteSFile    = 14.691603 sec. (write sorted file [line by line])
  57. * -----------------------------
  58. *                 29.589201 sec.
  59. *
  60. ************************************************ exec definitions ***********
  61.  
  62. _LVOOpenLibrary        equ    -552
  63. _LVOCloseLibrary    equ    -414
  64. _LVOAllocMem              equ    -198
  65. _LVOFreeMem                equ    -210
  66. _LVOCacheClearU            equ    -636
  67.  
  68. ************************************************ dos definitions ************
  69.  
  70. _LVOOutput        equ    -060
  71. _LVOIoErr        equ    -132
  72. _LVOFPutC        equ    -312
  73. _LVOFPuts        equ    -342
  74. _LVOSetIoErr        equ    -462
  75. _LVOPrintFault        equ    -474
  76. _LVOReadArgs        equ    -798
  77. _LVOFreeArgs        equ    -858
  78. _LVOMatchFirst        equ    -822
  79. _LVOMatchNext        equ    -828
  80. _LVOMatchEnd        equ    -834
  81.  
  82. _LVOOpen                  equ    -030
  83. _LVOClose                  equ    -036
  84. _LVORead                   equ    -042
  85. _LVOWrite                  equ    -048
  86. _LVODeleteFile             equ    -072
  87. _LVORename                equ    -078
  88. _LVOLock                  equ    -084
  89. _LVOUnLock                 equ    -090
  90. _LVOCurrentDir             equ    -126
  91. _LVOSetComment             equ    -180
  92. _LVOSetProtection         equ    -186
  93. _LVOFlush                  equ    -360
  94. _LVOExamineFH              equ    -390
  95. _LVOCheckSignal            equ    -792
  96. _LVOFilePart               equ    -870
  97. _LVOPutStr                 equ    -948
  98. _LVOVPrintf                equ    -954
  99.  
  100. MODE_OLDFILE             equ    1005
  101. MODE_NEWFILE             equ    1006
  102.  
  103. ACCESS_READ        equ    -002
  104.  
  105. fib_DirEntryType    equ    $004
  106. fib_Protection        equ    $074
  107. fib_Size        equ    $07C
  108. fib_Comment        equ    $090
  109. fib_SIZEOF        equ    $104
  110.  
  111. FIBB_ARCHIVE        equ    $004
  112.  
  113. SIGBREAKB_CTRL_C    equ    $00C
  114. SIGBREAKB_CTRL_D    equ    $00D
  115. SIGBREAKB_CTRL_E    equ    $00E
  116. SIGBREAKB_CTRL_F    equ    $00F
  117.  
  118. ************************************************ bss datas ******************
  119.  
  120. FIBlock        rs.b    fib_SIZEOF        ;buffer for fileinfoblock
  121.  
  122. DOSBase        rs.l    1            ;ptr. base of library
  123.  
  124. ArgArray    rs.l    0            ;argarray
  125. IndexFile    rs.l    1            ;ptr. path/name indexfile
  126. OutputFile    rs.l    1            ;ptr. path/name outputfile
  127. SortedFile    rs.l    1            ;ptr. path/name sorted ifile
  128. SkipHead    rs.l    1            ;# of lines to skip
  129.  
  130. RDArgs        rs.l    1            ;returned by readargs
  131. IHandle        rs.l    1            ;handle indexfile
  132. OHandle        rs.l    1            ;handle outputfile
  133. SHandle        rs.l    1            ;handle sorted indexfile
  134. MemoryA        rs.l    1            ;membase indexfile
  135. MemoryB        rs.l    1            ;membase indexfile w/o head
  136. RCode1        rs.l    1            ;errorcode > rc
  137. RCode2        rs.l    1            ;errorcode > result2
  138. Count        rs.l    1            ;# of bytes written out/file
  139. SCount        rs.l    1            ;# of bytes written sort/file
  140. EList        rs.l    1            ;membase entrylist
  141. ELSize        rs.l    1            ;size of entrylist
  142. Lines        rs.l    1            ;# of lines (ifile w/o head)
  143.  
  144. BSS_Size    rs.b    0            ;bss_size over all
  145.  
  146. *****************************************************************************
  147.  
  148. Start        movem.l    D1-D7/A0-A6,-(SP)    ;save registers
  149.  
  150.         if    BSS_Section        ;check assembler condition
  151.  
  152.         movea.l    Start-4(pc),A5        ;get bss_section
  153.         addq.l    #1,A5            ;skip pointer (next segment)
  154.         adda.l    A5,A5            ;convert bpcl_pointer
  155.         adda.l    A5,A5            ;to real_address
  156.  
  157.         elseif                ;otherwise
  158.  
  159.         lea    DataBase(pc),A5        ;set data area
  160.  
  161.         endc                ;end condition
  162.  
  163. ************************************************ open libraries *************
  164.  
  165.         moveq    #20,D0            ;failat level
  166.         move.l    D0,RCode1(A5)        ;preset error (no library)
  167.  
  168.         movea.l    4.w,A6            ;set EXEC to call a function
  169.  
  170.         moveq    #37,D0            ;required library version
  171.         lea    DOSName(pc),A1        ;set library name
  172.         jsr    _LVOOpenLibrary(A6)    ;use EXEC to (openlibrary)
  173.         move.l    D0,DOSBase(A5)        ;save base
  174.  
  175.         beq.b    CloseLibs        ;branch if not open
  176.  
  177. *****************************************************************************
  178.  
  179.         bsr.b    Main
  180.  
  181. ************************************************ close libraries ************
  182.  
  183. CloseLibs    movea.l    4.w,A6            ;set EXEC to call a function
  184.  
  185. CloseDOS    move.l    DOSBase(A5),D1        ;get base_ptr
  186.         beq.b    ExitDOS            ;branch when not open
  187.         movea.l    D1,A1            ;set base_ptr
  188.         jsr    _LVOCloseLibrary(A6)    ;use EXEC to (closelibrary)
  189.  
  190. ExitDOS        move.l    RCode1(A5),D0        ;set returncode
  191.         movem.l    (SP)+,D1-D7/A0-A6    ;restore registers
  192.         rts                ;go back (shell)
  193.  
  194. *****************************************************************************
  195.  
  196. DOSName        dc.b    "dos.library",0
  197.  
  198. *****************************************************************************
  199.  
  200. version    dc.b "$VER: ChkIndex 1.9 32 (22.01.03) by joerg riemer jan'03",0
  201.  
  202. *****************************************************************************
  203.  
  204.         cnop    0,4
  205.  
  206. *****************************************************************************
  207.  
  208. Main        clr.l    RCode1(A5)        ;clear returncode
  209.  
  210.         bsr    ReadArgs        ;read user_arguments
  211.         bsr    CheckArgs        ;check for legal arguments
  212.         bsr    OpenOFile        ;open outputfile
  213.         bsr    OpenSFile        ;open sorted indexfile (new)
  214.         bsr    GetIFile        ;read indexfile
  215.         bsr    SkipHeader        ;skip headlines
  216.         bsr.b    ChkBreak        ;check for user break
  217.         bsr.b    CreateEList        ;create entrylist
  218.         bsr.b    ChkBreak        ;check for user break
  219.         bsr    SortEList        ;sort entrylist
  220.         bsr.b    ChkBreak        ;check for user break
  221.         bsr    WriteSFile        ;write sorted indexfile
  222.         bsr    GetMEntries        ;search for multiple entries
  223.  
  224. Quit        bsr    FreeEList        ;free memory (indexlist)
  225.         bsr    FreeMem            ;free memory (indexfile)
  226.         bsr    CloseIFile        ;close indexfile
  227.         bsr    CloseSFile        ;close sorted indexfile
  228.         bsr    CloseOFile        ;close outputfile
  229.         bsr    FreeArgs        ;free memory (readargs)
  230.         rts                ;go back
  231.  
  232. *****************************************************************************
  233.  
  234.         cnop    0,4
  235.  
  236. *****************************************************************************
  237.  
  238. ChkBreak    moveq    #00,D1            ;prepare signal mask
  239.         bset    #12,D1            ;set break bit (ctrl_c)
  240.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  241.         jsr    _LVOCheckSignal(A6)    ;use DOS to (checksignal)
  242.         btst    #12,D0            ;test break bit (ctrl_c)
  243.         bne    Error3            ;if set, branch (set ioerr)
  244.         rts                ;go back
  245.  
  246. *****************************************************************************
  247.  
  248.         cnop    0,4
  249.  
  250. *****************************************************************************
  251.  
  252. CreateEList    movea.l    MemoryB(A5),A0        ;base of indexfile w/o head
  253.  
  254.         moveq    #0,D0            ;prepare register
  255.  
  256.         moveq    #10,D7            ;set linefeed
  257.  
  258. ;-----------------------------------------------        
  259. .calclines    cmp.b    (A0)+,D7        ;search for linefeed
  260.         bne.b    .calclines        ;do until
  261.         addq.l    #1,D0            ;inc. number of lines
  262.         tst.b    (A0)            ;check for eof
  263.         bne.b    .calclines        ;do until
  264. ;-----------------------------------------------
  265.  
  266.         move.l    D0,Lines(A5)        ;save # of lines
  267.  
  268.         lsl.l    #3,D0            ;need 8 bytes for each line!
  269.  
  270.         addq.l    #8,D0            ;list terminator
  271.  
  272.         move.l    D0,ELSize(A5)        ;save size
  273.  
  274.         moveq    #0,D1            ;no memory options
  275.  
  276.         movea.l    4.w,A6            ;set EXEC to call a function
  277.         jsr    _LVOAllocMem(A6)    ;use EXEC to (allocmem)
  278.         move.l    D0,EList(A5)        ;save memorybase
  279.         beq    Error2            ;branch if fail (close file)
  280.  
  281. ;-----------------------------------------------
  282.  
  283.         movea.l    MemoryB(A5),A0        ;get indexfile
  284.         movea.l    EList(A5),A1        ;get entrylist
  285.  
  286. .addlist    moveq.l    #0,D0            ;reset register
  287.         move.l    A0,(A1)+        ;save base of line
  288. .getlength    addq.l    #1,D0            ;inc. length of line
  289.         cmp.b    (A0)+,D7        ;search for linefeed
  290.         bne.b    .getlength        ;do until
  291.         move.l    D0,(A1)+        ;save length of line
  292.         tst.b    (A0)            ;check for eof
  293.         bne.b    .addlist        ;do until
  294.  
  295.         moveq    #0,D0            ;get terminator
  296.         move.l    D0,(A1)+        ;set list_terminator
  297.         move.l    D0,(A1)            ;set list_terminator
  298.  
  299.         rts                ;go back
  300.  
  301. ******************************************************************************
  302.  
  303.         cnop    0,4
  304.  
  305. ***********************************************  sort indexlist *************
  306.  
  307. SortEList    movea.l    EList(A5),A0        ;get entrylist
  308.         move.l    Lines(A5),D1        ;get # of lines
  309.         beq    QuitSort        ;branch if zero
  310.  
  311.         moveq    #0,D0            ;init. left
  312.         subq.l    #1,D1            ;init. right
  313.  
  314.         moveq    #32,D3            ;compare lowercase!
  315.  
  316. quicksort:    movem.l    D4-7,-(SP)
  317.  
  318. ************************************************
  319. * le = lo; ri = hi *****************************
  320.  
  321.         move.l    D0,D4            ;left
  322.         move.l    D1,D5            ;right
  323.  
  324.         move.l    D0,D6            ;low
  325.         move.l    D1,D7            ;high
  326.  
  327. ************************************************
  328. * p = (hi+lo)/2 ********************************
  329.     
  330.         move.l    D1,D2            ;get high
  331.         add.l    D0,D2            ;(hi+lo)
  332.         lsr.l    #1,D2            ;(hi+lo)/2
  333.         lsl.l    #3,D2            ;offset for 2 lwords
  334.         move.l    0(A0,D2.l),A3        ;get pivotelement
  335.         move.l    4(A0,D2.l),A4        ;get length of pivotelement
  336.         subq.l    #1,A4            ;dbra!!
  337.  
  338.         bra.b    le_loop_1
  339.  
  340. ************************************************
  341. * while (f[le] < p) ; le++ *********************
  342.  
  343. le_loop_2    addq.l    #1,D4            ;le++
  344.  
  345. le_loop_1    move.l    D4,D0            ;set left_index
  346.         lsl.l    #3,D0            ;prepare offset
  347.         movea.l    0(A0,D0.l),A1        ;get entry to compare
  348.         movea.l    A3,A2            ;set pivotelement
  349.         move.l    A4,D2            ;set length of pivotelement
  350.  
  351. le_compare    move.b    (A1)+,D0        ;compare entries
  352.         move.b    (A2)+,D1        ;char. by char.
  353.         or.b    D3,D0            ;force lowercase
  354.         or.b    D3,D1            ;for both
  355.         cmp.b    D1,D0
  356.         dbne    d2,le_compare        ;do until eol
  357.  
  358.         bhi.b    ri_loop_1        ;branch if entry > pivot
  359.  
  360.         tst.w    d2            ;entry = pivot ?
  361.         bpl.b    le_loop_2        ;inc. left_index if not
  362.         
  363. ************************************************
  364.  
  365.         bra.b    ri_loop_1
  366.  
  367. ************************************************
  368. * while ( p < f[ri]); ri-- *********************
  369.  
  370. ri_loop_2    subq.l    #1,D5            ;ri--
  371.  
  372. ri_loop_1    move.l    D5,D0            ;set right_index
  373.         lsl.l    #3,D0            ;prepare offset
  374.         movea.l    0(A0,D0.l),A1        ;get entry to compare
  375.         movea.l    A3,A2            ;set pivotelement
  376.         move.l    A4,D2            ;set length of pivotelement
  377.  
  378. ri_compare    move.b    (A1)+,D0        ;compare entries
  379.         move.b    (A2)+,D1        ;char. by char.
  380.         or.b    D3,D0            ;force lowercase
  381.         or.b    D3,D1            ;for both
  382.         cmp.b    D1,D0
  383.         dbne    d2,ri_compare        ;do until eol
  384.  
  385.         bcs.b    skip1            ;branch if entry < pivot
  386.  
  387.         tst.w    d2            ;entry = pivot ?
  388.         bpl.b    ri_loop_2        ;dec. right_index if not
  389.  
  390. ************************************************
  391. * if (le <= ri); swap (f,le,ri); le++; ri-- ****
  392.  
  393. skip1        cmp.l    D5,D4            ;left<=right ?
  394.         bgt.b    skip2            ;
  395.         beq.b    skip3            ;
  396.  
  397.         move.l    D4,D0            ;left
  398.         lsl.l    #3,D0
  399.         movea.l    A0,A1
  400.         adda.l    D0,A1
  401.  
  402.         move.l    D5,D1            ;right
  403.         lsl.l    #3,D1
  404.         movea.l    A0,A2
  405.         adda.l    D1,A2
  406.  
  407.         move.l    (A1),D2            ;24 swap entry pointers
  408.         move.l    (A2),(A1)+        ;40
  409.         move.l    D2,(A2)+        ;24
  410.  
  411.         move.l    (A1),D2            ;24 swap entry_length, too
  412.         move.l    (A2),(A1)        ;40
  413.         move.l    D2,(A2)            ;24 176
  414.         
  415. skip3        addq.l    #1,D4            ;le++
  416.         subq.l    #1,D5            ;ri--
  417.  
  418. ************************************************
  419. * if le <= ri do again *************************
  420.  
  421.         cmp.l    D5,D4            ;right,left
  422.         ble.b    le_loop_1
  423.  
  424. ************************************************
  425. * if (lo < ri) quicksort (f,lo,ri) *************
  426.  
  427. skip2        cmp.l    D5,D6            ;right,low
  428.         bge.b    goon_1
  429.  
  430.         move.l    D6,D0            ;
  431.         move.l    D5,D1
  432.         bsr    quicksort
  433.  
  434. ************************************************
  435. * if (le < hi) quicksort (f,le,hi) *************
  436.  
  437. goon_1:        cmp.l    D4,D7            ;left,high
  438.         ble.b    goon_2
  439.  
  440.         move.l    D4,D0            ;left
  441.         move.l    D7,D1            ;high
  442.         bsr    quicksort
  443.  
  444. ************************************************
  445.  
  446. goon_2:        movem.l (SP)+,D4-7
  447. QuitSort    rts
  448.  
  449. *****************************************************************************
  450.  
  451.         cnop    0,4
  452.  
  453. *****************************************************************************
  454.  
  455. WriteSFile    move.l    SHandle(A5),D6        ;get filehandle
  456.         beq.b    .quit            ;quit if not set
  457.  
  458.         move.l    Lines(A5),D7        ;get # of lines
  459.         movea.l    EList(A5),A2        ;get entrylist
  460.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  461.  
  462. .WriteLine    move.l    D6,D1            ;set file
  463.         move.l    (A2)+,D2        ;set buffer
  464.         move.l    (A2)+,D3        ;set size
  465.         jsr    _LVOWrite(A6)        ;write file (line by line)
  466.  
  467.         add.l    D0,SCount(A5)        ;inc. byte count
  468.  
  469.         subq.l    #1,D7            ;dec. line count
  470.         bne.b    .WriteLine        ;do for all lines
  471. .quit        rts                ;go back
  472.  
  473. *****************************************************************************
  474.  
  475.         cnop    0,4
  476.  
  477. *****************************************************************************
  478.  
  479. GetMEntries    moveq    #32,D5            ;compare lowercase!
  480.         moveq    #0,D6            ;skip_over flag
  481.         bset    #31,D6            ;for compared entries
  482.         move.l    OHandle(A5),D7        ;file_handle
  483.         movea.l    DOSBase(A5),A6        ;DOSbase
  484.  
  485.         bsr    Search_0    ;filename,path
  486.         bsr    Search_1    ;filename,size,age,description
  487.         bsr    Search_3    ;filename,size,age
  488.         bsr    Search_2    ;filename,size,description
  489.         bsr    Search_5    ;filename,size
  490.         bsr    Search_4    ;filename,age,description
  491.         bsr    Search_6    ;filename,age
  492.         bsr.b    Search_7    ;filename,description
  493. *        bsr    Search_8    ;filename
  494.  
  495. *****************************************************************************
  496.  
  497. * search FILENAME
  498.  
  499. Search_8    move.l    D7,D1            ;set file
  500.         lea    String8(pc),A0        ;get buffer
  501.         move.l    A0,D2            ;set buffer
  502.         move.l    #S8Size,D3        ;set length
  503.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  504.  
  505.         movea.l    EList(A5),A2        ;entrylist
  506.  
  507.         subq.l    #8,A2            ;simple avoids bra!
  508.  
  509. .IncListA    addq.l    #8,A2            ;inc. list_a
  510.         tst.l    (A2)            ;check for eol
  511.         beq    QuitSearch        ;branch if so
  512.         tst.l    4(A2)            ;test for skip_over
  513.         bmi.b    .IncListA        ;branch if so
  514.  
  515.         moveq    #0,D4            ;clr flag (print sourceline)
  516.         movea.l    A2,A3            ;set list_b
  517.  
  518. .IncListB    addq.l    #8,A3            ;inc. list_b
  519.         move.l    (A3),D1            ;check for eol
  520.         beq    QuitSearch        ;branch if so
  521.         tst.l    4(A3)            ;test for skip_over
  522.         bmi.b    .IncListB        ;branch if so
  523.  
  524. ;-----------------------------------------------
  525.  
  526.         moveq    #18,D2            ;loopcounter
  527.  
  528.         movea.l    (A2),A0            ;get filename_field entry (a)
  529.         movea.l    D1,A1            ;get filename_field entry (b)
  530.  
  531. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  532.         move.b    (A1)+,D1        ;char. by char.
  533.         or.b    D5,D0            ;force lowercase
  534.         or.b    D5,D1            ;for both
  535.         cmp.b    D0,D1            ;compare chars.
  536.         dbne    D2,.Compare_1        ;do loop as long as equal
  537.                         ;and counter is positive
  538.         tst.w    D2            ;found same filenames ?
  539.         bpl.b    .IncListA        ;branch if not
  540.  
  541.         pea    .IncListB(pc)        ;set return_address
  542.         bra    WriteEntries        ;save entries
  543.  
  544. *****************************************************************************
  545.  
  546.         cnop    0,4
  547.  
  548. *****************************************************************************
  549.  
  550. * search FILENAME, DESCRIPTION
  551.  
  552. Search_7    move.l    D7,D1            ;set file
  553.         lea    String7(pc),A0        ;get buffer
  554.         move.l    A0,D2            ;set buffer
  555.         move.l    #S7Size,D3        ;set length
  556.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  557.  
  558.         movea.l    EList(A5),A2        ;entrylist
  559.  
  560.         subq.l    #8,A2            ;simple avoids bra!
  561.  
  562. .IncListA    addq.l    #8,A2            ;inc. list_a
  563.         tst.l    (A2)            ;check for eol
  564.         beq    QuitSearch        ;branch if so
  565.         tst.l    4(A2)            ;test for skip_over
  566.         bmi.b    .IncListA        ;branch if so
  567.  
  568.         moveq    #0,D4            ;clr flag (print sourceline)
  569.         movea.l    A2,A3            ;set list_b
  570.  
  571. .IncListB    addq.l    #8,A3            ;inc. list_b
  572.         move.l    (A3),D1            ;check for eol
  573.         beq    QuitSearch        ;branch if so
  574.         tst.l    4(A3)            ;test for skip_over
  575.         bmi.b    .IncListB        ;branch if so
  576.  
  577. ;-----------------------------------------------
  578.  
  579.         moveq    #18,D2            ;loopcounter
  580.  
  581.         movea.l    (A2),A0            ;get filename_field entry (a)
  582.         movea.l    D1,A1            ;get filename_field entry (b)
  583.  
  584. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  585.         move.b    (A1)+,D1        ;char. by char.
  586.         or.b    D5,D0            ;force lowercase
  587.         or.b    D5,D1            ;for both
  588.         cmp.b    D0,D1            ;compare chars.
  589.         dbne    D2,.Compare_1        ;do loop as long as equal
  590.                         ;and counter is positive
  591.         tst.w    D2            ;found same filenames ?
  592.         bpl.b    .IncListA        ;branch if not
  593.  
  594. ;-----------------------------------------------        
  595.  
  596.         move.l    4(A2),D2        ;loopcounter 
  597.         sub.l    #39,D2            
  598.  
  599.         lea    19(A0),A0        ;get description_field (a)
  600.         lea    19(A1),A1        ;get description_field (b)
  601.  
  602. .Compare_4    move.b    (A0)+,D0        ;compare file_descriptions
  603.         move.b    (A1)+,D1        ;char. by char.
  604.         or.b    D5,D0            ;force lowercase
  605.         or.b    D5,D1            ;for both
  606.         cmp.b    D0,D1            ;compare chars.
  607.         dbne    D2,.Compare_4        ;do loop as long as equal
  608.                         ;and counter is positive
  609.         tst.w    D2            ;found same description ?
  610.         bpl.b    .IncListB        ;branch if not
  611.  
  612.         pea    .IncListB(pc)        ;set return_address
  613.         bra    WriteEntries        ;save entries
  614.  
  615. *****************************************************************************
  616.  
  617.         cnop    0,4
  618.  
  619. *****************************************************************************
  620.  
  621. * search FILENAME, AGE
  622.  
  623. Search_6    move.l    D7,D1            ;set file
  624.         lea    String6(pc),A0        ;get buffer
  625.         move.l    A0,D2            ;set buffer
  626.         move.l    #S6Size,D3        ;set length
  627.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  628.  
  629.         movea.l    EList(A5),A2        ;entrylist
  630.  
  631.         subq.l    #8,A2            ;simple avoids bra!
  632.  
  633. .IncListA    addq.l    #8,A2            ;inc. list_a
  634.         tst.l    (A2)            ;check for eol
  635.         beq    QuitSearch        ;branch if so
  636.         tst.l    4(A2)            ;test for skip_over
  637.         bmi.b    .IncListA        ;branch if so
  638.  
  639.         moveq    #0,D4            ;clr flag (print sourceline)
  640.         movea.l    A2,A3            ;set list_b
  641.  
  642. .IncListB    addq.l    #8,A3            ;inc. list_b
  643.         move.l    (A3),D1            ;check for eol
  644.         beq    QuitSearch        ;branch if so
  645.         tst.l    4(A3)            ;test for skip_over
  646.         bmi.b    .IncListB        ;branch if so
  647.  
  648. ;-----------------------------------------------
  649.  
  650.         moveq    #18,D2            ;loopcounter
  651.  
  652.         movea.l    (A2),A0            ;get filename_field entry (a)
  653.         movea.l    D1,A1            ;get filename_field entry (b)
  654.  
  655. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  656.         move.b    (A1)+,D1        ;char. by char.
  657.         or.b    D5,D0            ;force lowercase
  658.         or.b    D5,D1            ;for both
  659.         cmp.b    D0,D1            ;compare chars.
  660.         dbne    D2,.Compare_1        ;do loop as long as equal
  661.                         ;and counter is positive
  662.         tst.w    D2            ;found same filenames ?
  663.         bpl.b    .IncListA        ;branch if not
  664.  
  665. ;-----------------------------------------------
  666.  
  667.         moveq    #2,D2            ;loopcounter
  668.  
  669.         lea     16(A0),A0        ;get age_field entry (a)
  670.         lea    16(A1),A1        ;get age_field entry (b)
  671.  
  672. .Compare_3    move.b    (A0)+,D0        ;compare filesizes
  673.         move.b    (A1)+,D1        ;char. by char.
  674.         or.b    D5,D0            ;force lowercase
  675.         or.b    D5,D1            ;for both
  676.         cmp.b    D0,D1            ;compare chars.
  677.         dbne    D2,.Compare_3        ;do loop as long as equal
  678.                         ;and counter is positive
  679.         tst.w    D2            ;found equal filesize ?
  680.         bpl.b    .IncListB        ;branch if not
  681.  
  682.         pea    .IncListB(pc)        ;set return_address
  683.         bra    WriteEntries        ;save entries
  684.  
  685. *****************************************************************************
  686.  
  687.         cnop    0,4
  688.  
  689. *****************************************************************************
  690.  
  691. * search FILENAME, SIZE
  692.  
  693. Search_5    move.l    D7,D1            ;set file
  694.         lea    String5(pc),A0        ;get buffer
  695.         move.l    A0,D2            ;set buffer
  696.         move.l    #S5Size,D3        ;set length
  697.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  698.  
  699.         movea.l    EList(A5),A2        ;entrylist
  700.  
  701.         subq.l    #8,A2            ;simple avoids bra!
  702.  
  703. .IncListA    addq.l    #8,A2            ;inc. list_a
  704.         tst.l    (A2)            ;check for eol
  705.         beq    QuitSearch        ;branch if so
  706.         tst.l    4(A2)            ;test for skip_over
  707.         bmi.b    .IncListA        ;branch if so
  708.  
  709.         moveq    #0,D4            ;clr flag (print sourceline)
  710.         movea.l    A2,A3            ;set list_b
  711.  
  712. .IncListB    addq.l    #8,A3            ;inc. list_b
  713.         move.l    (A3),D1            ;check for eol
  714.         beq    QuitSearch        ;branch if so
  715.         tst.l    4(A3)            ;test for skip_over
  716.         bmi.b    .IncListB        ;branch if so
  717.  
  718. ;-----------------------------------------------
  719.  
  720.         moveq    #18,D2            ;loopcounter
  721.  
  722.         movea.l    (A2),A0            ;get filename_field entry (a)
  723.         movea.l    D1,A1            ;get filename_field entry (b)
  724.  
  725. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  726.         move.b    (A1)+,D1        ;char. by char.
  727.         or.b    D5,D0            ;force lowercase
  728.         or.b    D5,D1            ;for both
  729.         cmp.b    D0,D1            ;compare chars.
  730.         dbne    D2,.Compare_1        ;do loop as long as equal
  731.                         ;and counter is positive
  732.         tst.w    D2            ;found same filenames ?
  733.         bpl.b    .IncListA        ;branch if not
  734.  
  735. ;-----------------------------------------------
  736.  
  737.         moveq    #4,D2            ;loopcounter
  738.  
  739.         lea     11(A0),A0        ;get size_field entry (a)
  740.         lea    11(A1),A1        ;get size_field entry (b)
  741.  
  742. .Compare_2    move.b    (A0)+,D0        ;compare filesizes
  743.         move.b    (A1)+,D1        ;char. by char.
  744.         or.b    D5,D0            ;force lowercase
  745.         or.b    D5,D1            ;for both
  746.         cmp.b    D0,D1            ;compare chars.
  747.         dbne    D2,.Compare_2        ;do loop as long as equal
  748.                         ;and counter is positive
  749.         tst.w    D2            ;found equal filesize ?
  750.         bpl.b    .IncListB        ;branch if not
  751.  
  752.         pea    .IncListB(pc)        ;set return_address
  753.         bra    WriteEntries        ;save entries
  754.  
  755. *****************************************************************************
  756.  
  757.         cnop    0,4
  758.  
  759. *****************************************************************************
  760.  
  761. * search FILENAME, AGE, DESCRIPTION
  762.  
  763. Search_4    move.l    D7,D1            ;set file
  764.         lea    String4(pc),A0        ;get buffer
  765.         move.l    A0,D2            ;set buffer
  766.         move.l    #S4Size,D3        ;set length
  767.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  768.  
  769.         movea.l    EList(A5),A2        ;entrylist
  770.  
  771.         subq.l    #8,A2            ;simple avoids bra!
  772.  
  773. .IncListA    addq.l    #8,A2            ;inc. list_a
  774.         tst.l    (A2)            ;check for eol
  775.         beq    QuitSearch        ;branch if so
  776.         tst.l    4(A2)            ;test for skip_over
  777.         bmi.b    .IncListA        ;branch if so
  778.  
  779.         moveq    #0,D4            ;clr flag (print sourceline)
  780.         movea.l    A2,A3            ;set list_b
  781.  
  782. .IncListB    addq.l    #8,A3            ;inc. list_b
  783.         move.l    (A3),D1            ;check for eol
  784.         beq    QuitSearch        ;branch if so
  785.         tst.l    4(A3)            ;test for skip_over
  786.         bmi.b    .IncListB        ;branch if so
  787.  
  788. ;-----------------------------------------------
  789.  
  790.         moveq    #18,D2            ;loopcounter
  791.  
  792.         movea.l    (A2),A0            ;get filename_field entry (a)
  793.         movea.l    D1,A1            ;get filename_field entry (b)
  794.  
  795. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  796.         move.b    (A1)+,D1        ;char. by char.
  797.         or.b    D5,D0            ;force lowercase
  798.         or.b    D5,D1            ;for both
  799.         cmp.b    D0,D1            ;compare chars.
  800.         dbne    D2,.Compare_1        ;do loop as long as equal
  801.                         ;and counter is positive
  802.         tst.w    D2            ;found same filenames ?
  803.         bpl.b    .IncListA        ;branch if not
  804.  
  805. ;-----------------------------------------------
  806.  
  807.         moveq    #2,D2            ;loopcounter
  808.  
  809.         lea     16(A0),A0        ;get age_field entry (a)
  810.         lea    16(A1),A1        ;get age_field entry (b)
  811.  
  812. .Compare_3    move.b    (A0)+,D0        ;compare filesizes
  813.         move.b    (A1)+,D1        ;char. by char.
  814.         or.b    D5,D0            ;force lowercase
  815.         or.b    D5,D1            ;for both
  816.         cmp.b    D0,D1            ;compare chars.
  817.         dbne    D2,.Compare_3        ;do loop as long as equal
  818.                         ;and counter is positive
  819.         tst.w    D2            ;found equal filesize ?
  820.         bpl.b    .IncListB        ;branch if not
  821.  
  822. ;-----------------------------------------------        
  823.  
  824.         move.l    4(A2),D2        ;loopcounter 
  825.         sub.l    #39,D2            
  826.  
  827. .Compare_4    move.b    (A0)+,D0        ;compare file_descriptions
  828.         move.b    (A1)+,D1        ;char. by char.
  829.         or.b    D5,D0            ;force lowercase
  830.         or.b    D5,D1            ;for both
  831.         cmp.b    D0,D1            ;compare chars.
  832.         dbne    D2,.Compare_4        ;do loop as long as equal
  833.                         ;and counter is positive
  834.         tst.w    D2            ;found same description ?
  835.         bpl.b    .IncListB        ;branch if not
  836.  
  837.         pea    .IncListB(pc)        ;set return_address
  838.         bra    WriteEntries        ;save entries
  839.  
  840. *****************************************************************************
  841.  
  842.         cnop    0,4
  843.  
  844. *****************************************************************************
  845.  
  846. * search FILENAME, SIZE, AGE
  847.  
  848. Search_3    move.l    D7,D1            ;set file
  849.         lea    String3(pc),A0        ;get buffer
  850.         move.l    A0,D2            ;set buffer
  851.         move.l    #S3Size,D3        ;set length
  852.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  853.  
  854.         movea.l    EList(A5),A2        ;entrylist
  855.  
  856.         subq.l    #8,A2            ;simple avoids bra!
  857.  
  858. .IncListA    addq.l    #8,A2            ;inc. list_a
  859.         tst.l    (A2)            ;check for eol
  860.         beq    QuitSearch        ;branch if so
  861.         tst.l    4(A2)            ;test for skip_over
  862.         bmi.b    .IncListA        ;branch if so
  863.  
  864.         moveq    #0,D4            ;clr flag (print sourceline)
  865.         movea.l    A2,A3            ;set list_b
  866.  
  867. .IncListB    addq.l    #8,A3            ;inc. list_b
  868.         move.l    (A3),D1            ;check for eol
  869.         beq    QuitSearch        ;branch if so
  870.         tst.l    4(A3)            ;test for skip_over
  871.         bmi.b    .IncListB        ;branch if so
  872.  
  873. ;-----------------------------------------------
  874.  
  875.         moveq    #18,D2            ;loopcounter
  876.  
  877.         movea.l    (A2),A0            ;get filename_field entry (a)
  878.         movea.l    D1,A1            ;get filename_field entry (b)
  879.  
  880. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  881.         move.b    (A1)+,D1        ;char. by char.
  882.         or.b    D5,D0            ;force lowercase
  883.         or.b    D5,D1            ;for both
  884.         cmp.b    D0,D1            ;compare chars.
  885.         dbne    D2,.Compare_1        ;do loop as long as equal
  886.                         ;and counter is positive
  887.         tst.w    D2            ;found same filenames ?
  888.         bpl.b    .IncListA        ;branch if not
  889.  
  890. ;-----------------------------------------------
  891.  
  892.         moveq    #4,D2            ;loopcounter
  893.  
  894.         lea     11(A0),A0        ;get size_field entry (a)
  895.         lea    11(A1),A1        ;get size_field entry (b)
  896.  
  897. .Compare_2    move.b    (A0)+,D0        ;compare filesizes
  898.         move.b    (A1)+,D1        ;char. by char.
  899.         or.b    D5,D0            ;force lowercase
  900.         or.b    D5,D1            ;for both
  901.         cmp.b    D0,D1            ;compare chars.
  902.         dbne    D2,.Compare_2        ;do loop as long as equal
  903.                         ;and counter is positive
  904.         tst.w    D2            ;found equal filesize ?
  905.         bpl.b    .IncListB        ;branch if not
  906.  
  907. ;-----------------------------------------------
  908.  
  909.         moveq    #2,D2            ;loopcounter
  910.  
  911. .Compare_3    move.b    (A0)+,D0        ;compare fileages
  912.         move.b    (A1)+,D1        ;char. by char.
  913.         or.b    D5,D0            ;force lowercase
  914.         or.b    D5,D1            ;for both
  915.         cmp.b    D0,D1            ;compare chars.
  916.         dbne    D2,.Compare_3        ;do loop as long as equal
  917.                         ;and counter is positive
  918.         tst.w    D2            ;found equal filesize ?
  919.         bpl.b    .IncListB        ;branch if not
  920.  
  921.         pea    .IncListB(pc)        ;set return_address
  922.         bra    WriteEntries        ;save entries
  923.  
  924. *****************************************************************************
  925.  
  926.         cnop    0,4
  927.  
  928. *****************************************************************************
  929.  
  930. * search FILENAME, SIZE, DESCRIPTION
  931.  
  932. Search_2    move.l    D7,D1            ;set file
  933.         lea    String2(pc),A0        ;get buffer
  934.         move.l    A0,D2            ;set buffer
  935.         move.l    #S2Size,D3        ;set length
  936.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  937.  
  938.         movea.l    EList(A5),A2        ;entrylist
  939.  
  940.         subq.l    #8,A2            ;simple avoids bra!
  941.  
  942. .IncListA    addq.l    #8,A2            ;inc. list_a
  943.         tst.l    (A2)            ;check for eol
  944.         beq    QuitSearch        ;branch if so
  945.         tst.l    4(A2)            ;test for skip_over
  946.         bmi.b    .IncListA        ;branch if so
  947.  
  948.         moveq    #0,D4            ;clr flag (print sourceline)
  949.         movea.l    A2,A3            ;set list_b
  950.  
  951. .IncListB    addq.l    #8,A3            ;inc. list_b
  952.         move.l    (A3),D1            ;check for eol
  953.         beq    QuitSearch        ;branch if so
  954.         tst.l    4(A3)            ;test for skip_over
  955.         bmi.b    .IncListB        ;branch if so
  956.  
  957. ;-----------------------------------------------
  958.  
  959.         moveq    #18,D2            ;loopcounter
  960.  
  961.         movea.l    (A2),A0            ;get filename_field entry (a)
  962.         movea.l    D1,A1            ;get filename_field entry (b)
  963.  
  964. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  965.         move.b    (A1)+,D1        ;char. by char.
  966.         or.b    D5,D0            ;force lowercase
  967.         or.b    D5,D1            ;for both
  968.         cmp.b    D0,D1            ;compare chars.
  969.         dbne    D2,.Compare_1        ;do loop as long as equal
  970.                         ;and counter is positive
  971.         tst.w    D2            ;found same filenames ?
  972.         bpl.b    .IncListA        ;branch if not
  973.  
  974. ;-----------------------------------------------
  975.  
  976.         moveq    #4,D2            ;loopcounter
  977.  
  978.         lea     11(A0),A0        ;get size_field entry (a)
  979.         lea    11(A1),A1        ;get size_field entry (b)
  980.  
  981. .Compare_2    move.b    (A0)+,D0        ;compare filesizes
  982.         move.b    (A1)+,D1        ;char. by char.
  983.         or.b    D5,D0            ;force lowercase
  984.         or.b    D5,D1            ;for both
  985.         cmp.b    D0,D1            ;compare chars.
  986.         dbne    D2,.Compare_2        ;do loop as long as equal
  987.                         ;and counter is positive
  988.         tst.w    D2            ;found equal filesize ?
  989.         bpl.b    .IncListB        ;branch if not
  990.  
  991. ;-----------------------------------------------        
  992.  
  993.         move.l    4(A2),D2        ;loopcounter 
  994.         sub.l    #39,D2            
  995.  
  996.         addq    #3,A0            ;get description_field (a)
  997.         addq    #3,A1            ;get description_field (b)
  998.  
  999. .Compare_4    move.b    (A0)+,D0        ;compare file_descriptions
  1000.         move.b    (A1)+,D1        ;char. by char.
  1001.         or.b    D5,D0            ;force lowercase
  1002.         or.b    D5,D1            ;for both
  1003.         cmp.b    D0,D1            ;compare chars.
  1004.         dbne    D2,.Compare_4        ;do loop as long as equal
  1005.                         ;and counter is positive
  1006.         tst.w    D2            ;found same description ?
  1007.         bpl.b    .IncListB        ;branch if not
  1008.  
  1009.         pea    .IncListB(pc)        ;set return_address
  1010.         bra    WriteEntries        ;save entries
  1011.  
  1012. *****************************************************************************
  1013.  
  1014.         cnop    0,4
  1015.  
  1016. *****************************************************************************
  1017.  
  1018. * search FILENAME, SIZE, AGE, DESCRIPTION
  1019.  
  1020. Search_1    move.l    D7,D1            ;set file
  1021.         lea    String1(pc),A0        ;get buffer
  1022.         move.l    A0,D2            ;set buffer
  1023.         move.l    #S1Size,D3        ;set length
  1024.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  1025.  
  1026.         movea.l    EList(A5),A2        ;entrylist
  1027.  
  1028.         subq.l    #8,A2            ;simple avoids bra!
  1029.  
  1030. .IncListA    addq.l    #8,A2            ;inc. list_a
  1031.         tst.l    (A2)            ;check for eol
  1032.         beq    QuitSearch        ;branch if so
  1033.         tst.l    4(A2)            ;test for skip_over
  1034.         bmi.b    .IncListA        ;branch if so
  1035.  
  1036.         moveq    #0,D4            ;clr flag (print sourceline)
  1037.         movea.l    A2,A3            ;set list_b
  1038.  
  1039. .IncListB    addq.l    #8,A3            ;inc. list_b
  1040.         move.l    (A3),D1            ;check for eol
  1041.         beq    QuitSearch        ;branch if so
  1042.         tst.l    4(A3)            ;test for skip_over
  1043.         bmi.b    .IncListB        ;branch if so
  1044.  
  1045. ;-----------------------------------------------
  1046.  
  1047.         moveq    #18,D2            ;loopcounter
  1048.  
  1049.         movea.l    (A2),A0            ;get filename_field entry (a)
  1050.         movea.l    D1,A1            ;get filename_field entry (b)
  1051.  
  1052. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  1053.         move.b    (A1)+,D1        ;char. by char.
  1054.         or.b    D5,D0            ;force lowercase
  1055.         or.b    D5,D1            ;for both
  1056.         cmp.b    D0,D1            ;compare chars.
  1057.         dbne    D2,.Compare_1        ;do loop as long as equal
  1058.                         ;and counter is positive
  1059.         tst.w    D2            ;found same filenames ?
  1060.         bpl.b    .IncListA        ;branch if not
  1061.  
  1062. ;-----------------------------------------------
  1063.  
  1064.         moveq    #4,D2            ;loopcounter
  1065.  
  1066.         lea     11(A0),A0        ;get size_field entry (a)
  1067.         lea    11(A1),A1        ;get size_field entry (b)
  1068.  
  1069. .Compare_2    move.b    (A0)+,D0        ;compare filesizes
  1070.         move.b    (A1)+,D1        ;char. by char.
  1071.         or.b    D5,D0            ;force lowercase
  1072.         or.b    D5,D1            ;for both
  1073.         cmp.b    D0,D1            ;compare chars.
  1074.         dbne    D2,.Compare_2        ;do loop as long as equal
  1075.                         ;and counter is positive
  1076.         tst.w    D2            ;found equal filesize ?
  1077.         bpl.b    .IncListB        ;branch if not
  1078.  
  1079. ;-----------------------------------------------
  1080.  
  1081.         moveq    #2,D2            ;loopcounter
  1082.  
  1083. .Compare_3    move.b    (A0)+,D0        ;compare fileages
  1084.         move.b    (A1)+,D1        ;char. by char.
  1085.         or.b    D5,D0            ;force lowercase
  1086.         or.b    D5,D1            ;for both
  1087.         cmp.b    D0,D1            ;compare chars.
  1088.         dbne    D2,.Compare_3        ;do loop as long as equal
  1089.                         ;and counter is positive
  1090.         tst.w    D2            ;found equal filesize ?
  1091.         bpl.b    .IncListB        ;branch if not
  1092.  
  1093. ;-----------------------------------------------        
  1094.  
  1095.         move.l    4(A2),D2        ;loopcounter 
  1096.         sub.l    #39,D2            
  1097.  
  1098. .Compare_4    move.b    (A0)+,D0        ;compare file_descriptions
  1099.         move.b    (A1)+,D1        ;char. by char.
  1100.         or.b    D5,D0            ;force lowercase
  1101.         or.b    D5,D1            ;for both
  1102.         cmp.b    D0,D1            ;compare chars.
  1103.         dbne    D2,.Compare_4        ;do loop as long as equal
  1104.                         ;and counter is positive
  1105.         tst.w    D2            ;found same description ?
  1106.         bpl.b    .IncListB        ;branch if not
  1107.  
  1108.         pea    .IncListB(pc)        ;set return_address
  1109.         bra.b    WriteEntries        ;save entries
  1110.  
  1111. *****************************************************************************
  1112.  
  1113.         cnop    0,4
  1114.  
  1115. *****************************************************************************
  1116.  
  1117. * search FILENAME, PATH
  1118.  
  1119. Search_0    move.l    D7,D1            ;set file
  1120.         lea    String0(pc),A0        ;get buffer
  1121.         move.l    A0,D2            ;set buffer
  1122.         move.l    #S0Size,D3        ;set length
  1123.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  1124.  
  1125.         movea.l    EList(A5),A2        ;entrylist
  1126.  
  1127.         subq.l    #8,A2            ;simple avoids bra!
  1128.  
  1129. .IncListA    addq.l    #8,A2            ;inc. list_a
  1130.         tst.l    (A2)            ;check for eol
  1131.         beq.b    QuitSearch        ;branch if so
  1132.         tst.l    4(A2)            ;test for skip_over
  1133.         bmi.b    .IncListA        ;branch if so
  1134.  
  1135.         moveq    #0,D4            ;clr flag (print sourceline)
  1136.         movea.l    A2,A3            ;set list_b
  1137.  
  1138. .IncListB    addq.l    #8,A3            ;inc. list_b
  1139.         move.l    (A3),D1            ;check for eol
  1140.         beq.b    QuitSearch        ;branch if so
  1141.         tst.l    4(A3)            ;test for skip_over
  1142.         bmi.b    .IncListB        ;branch if so
  1143.  
  1144. ;-----------------------------------------------
  1145.  
  1146.         moveq    #29,D2            ;loopcounter
  1147.  
  1148.         movea.l    (A2),A0            ;get filename_field entry (a)
  1149.         movea.l    D1,A1            ;get filename_field entry (b)
  1150.  
  1151. .Compare_1    move.b    (A0)+,D0        ;compare filenames
  1152.         move.b    (A1)+,D1        ;char. by char.
  1153.         or.b    D5,D0            ;force lowercase
  1154.         or.b    D5,D1            ;for both
  1155.         cmp.b    D0,D1            ;compare chars.
  1156.         dbne    D2,.Compare_1        ;do loop as long as equal
  1157.                         ;and counter is positive
  1158.         tst.w    D2            ;found same filenames ?
  1159.         bpl.b    .IncListA        ;branch if not
  1160.  
  1161.         pea    .IncListB(pc)        ;set return_address
  1162.  
  1163. *****************************************************************************
  1164.  
  1165. WriteEntries    tst.b    D4            ;write entry (a) ?
  1166.         bne.b    .WriteEntry_b        ;no, entry (b) only!
  1167.  
  1168.         moveq    #1,D4            ;flag, entry (a) written!
  1169.  
  1170. .WriteEntry_a    move.l    D7,D1            ;set file
  1171.         move.l    (A2),D2            ;set buffer
  1172.         move.l    4(A2),D3        ;set length
  1173.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  1174.  
  1175.         add.l    D0,Count(A5)        ;counter (written bytes)
  1176.         or.l    D6,4(A2)        ;set flag (skip_over)
  1177.  
  1178. .WriteEntry_b    move.l    D7,D1            ;set file
  1179.         move.l    (A3),D2            ;set buffer
  1180.         move.l    4(A3),D3        ;set length
  1181.         jsr    _LVOWrite(A6)        ;use DOS to (write) bytes
  1182.  
  1183.         add.l    D0,Count(A5)        ;counter (written bytes)
  1184.         or.l    D6,4(A3)        ;set flag (skip_over)
  1185.  
  1186. QuitSearch    rts                ;quit search (equal)
  1187.  
  1188. *****************************************************************************
  1189.  
  1190. String0    dc.b $A," ** entries - including same FILENAME; PATH",$A,$A
  1191. S0Size    equ *-String0
  1192.  
  1193. String1    dc.b $A," ** entries - including same FILENAME; SIZE; AGE; DESCRIPTION",$A,$A
  1194. S1Size    equ *-String1
  1195.  
  1196. String2    dc.b $A," ** entries - including same FILENAME; SIZE; DESCRIPTION",$A,$A
  1197. S2Size    equ *-String2
  1198.  
  1199. String3    dc.b $A," ** entries - including same FILENAME; SIZE; AGE",$A,$A
  1200. S3Size    equ *-String3
  1201.  
  1202. String4    dc.b $A," ** entries - including same FILENAME; AGE; DESCRIPTION",$A,$A
  1203. S4Size    equ *-String4
  1204.  
  1205. String5    dc.b $A," ** entries - including same FILENAME; SIZE",$A,$A
  1206. S5Size    equ *-String5
  1207.  
  1208. String6    dc.b $A," ** entries - including same FILENAME; AGE",$A,$A
  1209. S6Size    equ *-String6
  1210.  
  1211. String7    dc.b $A," ** entries - including same FILENAME; DESCRIPTION",$A,$A
  1212. S7Size    equ *-String7
  1213.  
  1214. String8    dc.b $A," ** entries - including same FILENAME",$A,$A
  1215. S8Size    equ *-String8
  1216.  
  1217.  
  1218. *****************************************************************************
  1219.  
  1220.         cnop    0,4
  1221.  
  1222. *****************************************************************************
  1223.  
  1224. SkipHeader    movea.l    MemoryA(A5),A0        ;get base of file
  1225.  
  1226.         tst.l    SkipHead(A5)        ;skip some lines?
  1227.         beq.b    .quit            ;no, quit
  1228.  
  1229.         movea.l    SkipHead(A5),A1        ;get skiphead value
  1230.         move.l    (A1),D0            ;set count
  1231.  
  1232.         moveq    #116,D1            ;preset errorcode
  1233.         moveq    #10,D2            ;linefeed
  1234.  
  1235. .getlines    cmp.b    (A0)+,D2        ;search linefeed
  1236.         bne.b    .getlines        
  1237.  
  1238.         tst.b    (A0)            ;check for eof
  1239.         beq    Error1            ;branch if so!
  1240.  
  1241.         subq.l    #1,D0            ;dec. counter
  1242.         bne.b    .getlines        ;do until zero
  1243.  
  1244. .quit        move.l    A0,MemoryB(A5)        ;set new base of file
  1245.         rts                ;go back
  1246.  
  1247. *****************************************************************************
  1248.  
  1249.         cnop    0,4
  1250.  
  1251. *****************************************************************************
  1252.  
  1253. OpenOFile    move.l    OutputFile(A5),D1    ;get filename
  1254.         move.l    #MODE_NEWFILE,D2    ;open new file!!
  1255.         movea.l    DOSBase(A5),A6        ;set dos_base
  1256.         jsr    _LVOOpen(A6)        ;use dos to open file
  1257.         move.l    D0,OHandle(A5)        ;save handle
  1258.         beq    Error2            ;print error when fail
  1259.         rts                ;go back
  1260.  
  1261. *****************************************************************************
  1262.  
  1263.         cnop    0,4
  1264.  
  1265. *****************************************************************************
  1266.  
  1267. OpenSFile    move.l    SortedFile(A5),D1    ;get filename
  1268.         beq.b    .quit            ;branch if not given
  1269.         move.l    #MODE_NEWFILE,D2    ;open new file
  1270.         movea.l    DOSBase(A5),A6        ;set dos_base
  1271.         jsr    _LVOOpen(A6)        ;use dos to open file
  1272.         move.l    D0,SHandle(A5)        ;save handle
  1273.         beq    Error2            ;branch if fail
  1274. .quit        rts                ;go back
  1275.  
  1276. *****************************************************************************
  1277.  
  1278.         cnop    0,4
  1279.  
  1280. *****************************************************************************
  1281.  
  1282. CloseOFile    move.l    OHandle(A5),D1        ;set filehandle
  1283.         beq.b    .quit            ;branch if not set!
  1284.  
  1285.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  1286.         jsr    _LVOClose(A6)        ;use DOS to (close) file
  1287.  
  1288.         moveq    #0,D0            ;clear filehandle
  1289.         move.l    D0,OHandle(A5)
  1290.  
  1291.         tst.l    Count(A5)        ;some bytes written ?
  1292.         bne.b    .quit            ;branch if so
  1293.  
  1294.         move.l    OutputFile(A5),D1    ;set filename
  1295.         jsr    _LVODeleteFile(A6)    ;use dos to (delete) file
  1296.     
  1297. .quit        rts                ;go back
  1298.  
  1299. *****************************************************************************
  1300.  
  1301.         cnop    0,4
  1302.  
  1303. *****************************************************************************
  1304.  
  1305. CloseSFile    move.l    SHandle(A5),D1        ;set filehandle
  1306.         beq.b    .quit            ;branch if not given
  1307.  
  1308.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  1309.         jsr    _LVOClose(A6)        ;use DOS to (close) file
  1310.  
  1311.         moveq    #0,D0            ;clear filehandle
  1312.         move.l    D0,SHandle(A5)
  1313.  
  1314.         tst.l    SCount(A5)        ;some bytes written ?
  1315.         bne.b    .quit            ;branch if so
  1316.  
  1317.         move.l    SortedFile(A5),D1    ;set filename
  1318.         jsr    _LVODeleteFile(A6)    ;use dos to (delete) file
  1319.     
  1320. .quit        rts                ;go back
  1321.  
  1322. *****************************************************************************
  1323.  
  1324.         cnop    0,4
  1325.  
  1326. *****************************************************************************
  1327.  
  1328. GetIFile    move.l    IndexFile(A5),D1    ;get filename
  1329.         move.l    #MODE_OLDFILE,D2    ;file exists!
  1330.         movea.l    DOSBase(A5),A6        ;set dos_base
  1331.         jsr    _LVOOpen(A6)        ;use dos to open file
  1332.         move.l    D0,IHandle(A5)        ;save filehandle
  1333.         beq    Error2            ;branch if not found
  1334. ;-----------------------------------------------
  1335.         move.l    IHandle(A5),D1        ;set filehandle
  1336.         lea    FIBlock(A5),A3        ;get buffer for FIB
  1337.         move.l    A3,D2            ;set FileInfoBlock
  1338.         jsr    _LVOExamineFH(A6)    ;use DOS to (examinefh)
  1339.         tst.l    D0            ;test for success
  1340.         beq    Error2            ;branch if not (close file)
  1341. ;-----------------------------------------------
  1342.         move.l    fib_Size(A3),D0        ;set filesize
  1343.         beq    Error2            ;empty file?...
  1344.  
  1345.         addq.l    #2,D0            ;need one linefeed +
  1346.                         ;null terminator at eof
  1347.         addq.l    #3,D0            ;get long aligned
  1348.         and.b    #-4,D0            ;get long aligned
  1349.  
  1350.         addq.l    #4,D0            ;add room for security ID
  1351.  
  1352.         moveq    #0,D1            ;no options
  1353.  
  1354.         movea.l    4.w,A6            ;set EXEC to call a function
  1355.         jsr    _LVOAllocMem(A6)    ;use EXEC to (allocmem)
  1356.         move.l    D0,MemoryA(A5)        ;save memorybase
  1357.         beq    Error2            ;branch if fail (close file)
  1358. ;----------------------------------------------------------------------------
  1359.         move.l    IHandle(A5),D1        ;set filehandle (read)
  1360.         movea.l    MemoryA(A5),A2        ;get membase (endmark)
  1361.         move.l    A2,D2            ;set membase    (read)
  1362.         move.l    fib_Size(A3),D3        ;set filesize   (read)
  1363. ;-----------------------------------------------
  1364.         move.l    D3,D0            ;get filesize
  1365.         addq.l    #2,D0            ;need one linefeed +
  1366.                         ;null terminator at eof
  1367.         addq.l    #3,D0            ;get long aligned
  1368.         and.b    #-4,D0            ;get long aligned
  1369.  
  1370.         move.l    #"EOF!",0(A2,D0.l)    ;set security ID
  1371. ;-----------------------------------------------
  1372.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  1373.         jsr    _LVORead(A6)        ;use DOS to (read) bytes
  1374.         cmp.l    D0,D3            ;test for success
  1375.         bne    Error2            ;branch if fail (free mem)
  1376. ;----------------------------------------------------------------------------
  1377.         moveq    #10,D0            ;get linefeed
  1378.         lea    -1(A2,D3.l),A0        ;jump to eof
  1379.         cmp.b    (A0)+,D0        ;check for linefeed
  1380.         beq.b    .skip            ;branch if set
  1381.  
  1382.         move.b    D0,(A0)+        ;add a linefeed at eof
  1383.  
  1384. .skip        clr.b    (A0)            ;set terminator
  1385.  
  1386. ************************************************
  1387.  
  1388. CloseIFile    move.l    IHandle(A5),D1        ;set filehandle
  1389.         beq.b    .skip
  1390.  
  1391.         movea.l    DOSBase(A5),A6        ;set DOS to call a function
  1392.         jsr    _LVOClose(A6)        ;use DOS to (close) file
  1393.  
  1394.         moveq    #0,D0            ;clear filehandle
  1395.         move.l    D0,IHandle(A5)
  1396.  
  1397. .skip        rts                ;go back
  1398.  
  1399. *****************************************************************************
  1400.  
  1401.         cnop    0,4
  1402.  
  1403. *****************************************************************************
  1404.  
  1405. FreeMem        move.l    MemoryA(A5),D1        ;get file memory
  1406.         beq.b    .skip            ;branch if not set
  1407.  
  1408.         movea.l    D1,A1            ;set memory base
  1409.         lea    FIBlock(A5),A0        ;get fileinfoblock
  1410.         move.l    fib_Size(A0),D0        ;set filesize
  1411.  
  1412.         addq.l    #2,D0            ;need one linefeed +
  1413.                         ;null terminator at eof
  1414.  
  1415.         addq.l    #3,D0            ;get long aligned
  1416.         and.b    #-4,D0            ;get long aligned
  1417.  
  1418.         addq.l    #4,D0            ;add room for security ID
  1419.  
  1420.         movea.l    4.w,A6            ;set EXEC to call a function
  1421.         jsr    _LVOFreeMem(A6)        ;use EXEC to (freemem)
  1422.  
  1423.         moveq    #0,D0            ;clear pointer
  1424.         move.l    D0,MemoryA(A5)
  1425.  
  1426. .skip        rts                ;go back
  1427.  
  1428. *****************************************************************************
  1429.  
  1430.         cnop    0,4
  1431.  
  1432. *****************************************************************************
  1433.  
  1434. FreeEList    move.l    EList(A5),D1        ;get elist memory
  1435.         beq.b    .skip            ;branch if not set
  1436.  
  1437.         movea.l    D1,A1            ;set memory base
  1438.  
  1439.         move.l    ELSize(A5),D0        ;set size
  1440.  
  1441.         movea.l    4.w,A6            ;set EXEC to call a function
  1442.         jsr    _LVOFreeMem(A6)        ;use EXEC to (freemem)
  1443.  
  1444.         moveq    #0,D0            ;clear pointer
  1445.         move.l    D0,EList(A5)
  1446.  
  1447. .skip        rts                ;go back
  1448.  
  1449. *****************************************************************************
  1450.  
  1451.         cnop    0,4
  1452.  
  1453. *****************************************************************************
  1454.  
  1455. ReadArgs    lea    Template(pc),A1        ;get template
  1456.         lea    ArgArray(A5),A2        ;get arg_array
  1457.         move.l    A1,D1            ;set arg_template
  1458.         move.l    A2,D2            ;set array
  1459.         moveq    #0,D3            ;set args (unused)
  1460.         movea.l    DOSBase(A5),A6        ;set dos_base
  1461.         jsr    _LVOReadArgs(A6)    ;use dos to readargs
  1462.         move.l    D0,RDArgs(A5)        ;save returncode
  1463.         beq.b    Error2
  1464.         rts                ;else, go back
  1465.  
  1466. *****************************************************************************
  1467.  
  1468. Template    dc.b    "INDEX/A,OUTPUT/A,WS=WRITESORTED/K,SKIP/N",0
  1469. Header        dc.b    "ERROR",0
  1470.  
  1471. *****************************************************************************
  1472.  
  1473.         cnop    0,4
  1474.  
  1475. *****************************************************************************
  1476.  
  1477. CheckArgs    moveq.    #116,D1            ;errorcode "wrong args..."
  1478.  
  1479.         tst.l    IndexFile(A5)        ;the indexfile (required)
  1480.         beq.b    Error1
  1481.  
  1482.         tst.l    OutputFile(A5)        ;the outputfile (required)
  1483.         beq.b    Error1            ;branch if nothing set
  1484.  
  1485.         rts
  1486.  
  1487. *****************************************************************************
  1488.  
  1489.         cnop    0,4
  1490.  
  1491. ************************************************ free argument buffer *******
  1492.  
  1493. FreeArgs    move.l    RDArgs(A5),D1        ;get arg_structure
  1494.         beq.b    .skip            ;branch if not set
  1495.  
  1496.         move.l    DOSBase(A5),A6        ;set dos_base
  1497.         jsr    _LVOFreeArgs(A6)    ;use dos to freeargs
  1498.  
  1499.         moveq    #0,D0            ;clear pointer
  1500.         move.l    D0,RDArgs(A5)
  1501.  
  1502. .skip        rts                ;go back
  1503.  
  1504. *****************************************************************************
  1505.  
  1506.         cnop    0,4
  1507.  
  1508. *****************************************************************************
  1509.  
  1510. Error3        move.w    #304,D1            ;set errorcode "***Break"
  1511.         ext.l    D1            ;clear highword
  1512.         bra.b    Error1
  1513.  
  1514. Error2        moveq    #0,D1            ;get errorcode by dos
  1515.  
  1516. Error1        addq    #4,SP            ;clear return_address
  1517.         move.l    D1,RCode2(A5)        ;set errorcode
  1518.         pea    Quit(pc)        ;set return_address
  1519.  
  1520. Error0        move.l    RCode2(A5),D1        ;get errorcode
  1521.         bne.b    .skip            ;branch if known!
  1522.  
  1523.         movea.l    DOSBase(A5),A6        ;set dos to call a function
  1524.         jsr    _LVOIoErr(A6)        ;use dos to get (ioerr)
  1525.  
  1526.         move.l    D0,D1            ;get errorcode
  1527.         move.l    D1,RCode2(A5)        ;set errorcode
  1528.         
  1529. .skip        movea.l    DOSBase(A5),A6        ;set dos_base
  1530.         jsr    _LVOSetIoErr(A6)    ;use dos to set pr_result2
  1531.  
  1532.         move.l    RCode2(A5),D1        ;get errorcode
  1533.         moveq    #0,D2            ;prepare dos printfault
  1534.  
  1535.         cmp.w    #304,D1            ;check for break by user
  1536.         beq.b    .PrintFault        ;branch if so
  1537.  
  1538.         lea    Header(pc),A2        ;get head_text 'ERROR:'
  1539.         move.l    A2,D2            ;set header
  1540.  
  1541. .PrintFault    jsr    _LVOPrintFault(A6)    ;use dos to printfault
  1542.  
  1543.         moveq    #5,D0            ;set returncode rc=warn
  1544.         move.l    D0,RCode1(A5)        ;save
  1545.         rts                ;go back
  1546.  
  1547. *****************************************************************************
  1548.  
  1549.         if    BSS_Section
  1550.  
  1551.         SECTION    ChkIndex_bss,BSS
  1552.  
  1553.         elseif
  1554.  
  1555.         cnop    0,4
  1556.  
  1557.         endc
  1558.  
  1559. *****************************************************************************
  1560.  
  1561. DataBase    ds.b    BSS_Size
  1562.  
  1563.  end of source **************************************************************
  1564.